package com.zql.JianZhiOffer;

/**
 * Created By ShuHua on 2022/4/30.
 */
public class Offer_17 {

    /**
     * 不考虑大数问题的解决方案
     * @param n
     * @return
     */
    public int[] printNumbers(int n) {
        int[] res = new int[(int) Math.pow(10,(double)n)-1];
        for(int i=0;i<res.length;i++){
            res[i]=i+1;
        }
        return res;
    }
    StringBuilder res= new StringBuilder();

    /**
     * 考虑大数问题，因为 不管是求数组长度时 ath.pow(10,(double)n)只能表示一定的范围
     * @param n
     * @return
     */
    public String printNumbers2(int n) {



        for(int digit=1;digit<=n;digit++){//表示要生成的尾数，如 2（10-99）
            char[] nums = new char[digit];
            for(char first='1';first<='9';first++){//固定第一位从一开始，如（1XXX）

                nums[0]=first;
                dfs(digit,nums,1);
            }
        }
        return res.toString();
    }

    /**
     *
     * @param digit 需要生成的位数
     * @param nums
     * @param index 实际生成的位数
     */
    public void dfs(int digit,char[] nums,int index){
        if(digit==index){//递归终止条件，当需要生成的位数digit和实际已生成的位数相同时，将生成的字符拼接到res中
            res.append(String.valueOf(nums)).append(",");//将num数组转成string，如{'1','0','0'} -> "100"
            return;
        }

        for(char i='0';i<='9';i++){
            nums[index]=i;

            dfs(digit,nums,index+1);
        }
    }
}
